/* Emacs style mode select   -*- C++ -*- */
/*-----------------------------------------------------------------------------*/

/* $Id:$*/

/* Copyright (C) 1993-1996 by id Software, Inc.*/

/* This source is available for distribution and/or modification*/
/* only under the terms of the DOOM Source Code License as*/
/* published by id Software. All rights reserved.*/

/* The source is distributed in the hope that it will be useful,*/
/* but WITHOUT ANY WARRANTY; without even the implied warranty of*/
/* FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License*/
/* for more details.*/

/* DESCRIPTION:*/


/*-----------------------------------------------------------------------------*/


#ifndef __D_PLAYER__
#define __D_PLAYER__


/* The player data structure depends on a number*/
/* of other structs: items (internal inventory),*/
/* animation states (closely tied to the sprites*/
/* used to represent them, unfortunately).*/
#include "d_items.h"
#include "p_pspr.h"

/* In addition, the player is just a special*/
/* case of the generic moving object/actor.*/
#include "p_mobj.h"

/* Finally, for odd reasons, the player input*/
/* is buffered within the player data struct,*/
/* as commands per game tick.*/
#include "d_ticcmd.h"

#ifdef __GNUG__
#pragma interface
#endif





/* Player states.*/

typedef enum
{
    /* Playing or camping.*/
    PST_LIVE,
    /* Dead on the ground, view follows killer.*/
    PST_DEAD,
    /* Ready to restart/respawn???*/
    PST_REBORN

} playerstate_t;



/* Player internal flags, for cheats and debug.*/

typedef enum
{
    /* No clipping, walk through barriers.*/
    CF_NOCLIP		= 1,
    /* No damage, no health loss.*/
    CF_GODMODE		= 2,
    /* Not really a cheat, just a debug aid.*/
    CF_NOMOMENTUM	= 4

} cheat_t;



/* Extended player object info: player_t*/

typedef struct player_s
{
    mobj_t*		mo;
    playerstate_t	playerstate;
    ticcmd_t		cmd;

    /* Determine POV,*/
    /*  including viewpoint bobbing during movement.*/
    /* Focal origin above r.z*/
    fixed_t		viewz;
    /* Base height above floor for viewz.*/
    fixed_t		viewheight;
    /* Bob/squat speed.*/
    fixed_t         	deltaviewheight;
    /* bounded/scaled total momentum.*/
    fixed_t         	bob;

    /* This is only used between levels,*/
    /* mo->health is used during levels.*/
    int			health;
    int			armorpoints;
    /* Armor type is 0-2.*/
    int			armortype;

    /* Power ups. invinc and invis are tic counters.*/
    int			powers[NUMPOWERS];
    boolean		cards[NUMCARDS];
    boolean		backpack;

    /* Frags, kills of other players.*/
    int			frags[MAXPLAYERS];
    weapontype_t	readyweapon;

    /* Is wp_nochange if not changing.*/
    weapontype_t	pendingweapon;

    boolean		weaponowned[NUMWEAPONS];
    int			ammo[NUMAMMO];
    int			maxammo[NUMAMMO];

    /* True if button down last tic.*/
    int			attackdown;
    int			usedown;

    /* Bit flags, for cheats and debug.*/
    /* See cheat_t, above.*/
    int			cheats;

    /* Refired shots are less accurate.*/
    int			refire;

     /* For intermission stats.*/
    int			killcount;
    int			itemcount;
    int			secretcount;

    /* Hint messages.*/
    char*		message;

    /* For screen flashing (red or bright).*/
    int			damagecount;
    int			bonuscount;

    /* Who did damage (NULL for floors/ceilings).*/
    mobj_t*		attacker;

    /* So gun flashes light up areas.*/
    int			extralight;

    /* Current PLAYPAL, ???*/
    /*  can be set to REDCOLORMAP for pain, etc.*/
    int			fixedcolormap;

    /* Player skin colorshift,*/
    /*  0-3 for which color to draw player.*/
    int			colormap;

    /* Overlay view sprites (gun, etc).*/
    pspdef_t		psprites[NUMPSPRITES];

    /* True if secret level has been done.*/
    boolean		didsecret;

} player_t;



/* INTERMISSION*/
/* Structure passed e.g. to WI_Start(wb)*/

typedef struct
{
    boolean	in;	/* whether the player is in game*/

    /* Player stats, kills, collected items etc.*/
    int		skills;
    int		sitems;
    int		ssecret;
    int		stime;
    int		frags[4];
    int		score;	/* current score on entry, modified on return*/

} wbplayerstruct_t;

typedef struct
{
    int		epsd;	/* episode # (0-2)*/

    /* if true, splash the secret level*/
    boolean	didsecret;

    /* previous and next levels, origin 0*/
    int		last;
    int		next;

    int		maxkills;
    int		maxitems;
    int		maxsecret;
    int		maxfrags;

    /* the par time*/
    int		partime;

    /* index of this player in game*/
    int		pnum;

    wbplayerstruct_t	plyr[MAXPLAYERS];

} wbstartstruct_t;


#endif
/*-----------------------------------------------------------------------------*/

/* $Log:$*/

/*-----------------------------------------------------------------------------*/
